package com.jdy.singleton.lazy;


/**
 * 懒汉式 内部类单例
 * <p>
 * 内部使用内部类的饿汉式单例，来避免线程安全问题，
 * 外部使用懒汉式单例，来减少内存开销
 * <p>
 * 性能最优的单例写法
 * <p>
 * 存在问题：反射调用的时候会破坏此单例模式
 */
public class LazyInnerClassSingleton {

    /**
     * 私有化构造方法
     */
    private LazyInnerClassSingleton() {
        throw new RuntimeException("Not support!");//防止反射破坏单例
    }

    /**
     * 懒汉式单例
     *
     * <p>
     * 提供全局访问点
     * <p>
     * LazyHolder等到此方法调用时，才执行，而内部类又使用饿汉式，完美避免了线程安全问题
     *
     * @return 单例对象
     */
    public static LazyInnerClassSingleton getInstance() {
        return LazyHolder.INSTANCE;
    }

    /**
     * 内部类实例单例模式
     */
    private static class LazyHolder {
        private static final LazyInnerClassSingleton INSTANCE =
                new LazyInnerClassSingleton();
    }
}
